" 1.第一个参数是list or dictionary; 第二个参数为函数
function IsProperName(name)
    if a:name =~? '\(Mr\|Miss\) .\+'
        return 1
    endif
    return 0
endfunction

let animal_names = {
    \ 'cat' : 'Miss Cattington',
    \ 'dog' : 'Mr Dogson',
    \ 'parrot' : 'Polly'
\ }

" 2.1.filter 使用函数
" v:val 字典中的值, v:key 字典中的键
call filter(animal_names, 'IsProperName(v:val)')
echo animal_names

let animal_names = {
    \ 'cat' : 'Miss Cattington',
    \ 'dog' : 'Mr Dogson',
    \ 'parrot' : 'Polly'
\ }
" 2.2.filter 使用函数引用
let IsProperName2 = function('IsProperName')
echo IsProperName2('Mr Dogson')

" 把函数引用作为参数传递给其他函数
function FunctionCaller(func,arg)
    return a:func(a:arg)
endfunction
echo FunctionCaller(IsProperName2, 'Miss Catington')

function IsProperNameKeyValue(key,value)
    if a:value =~? '\(Mr\|Miss\) .\+'
        return 1
    endif
    return 0
endfunction

call filter(animal_names, function('IsProperNameKeyValue'))
echo animal_names

" 3.filter用于列表时, v:key表示索引, v:val表示值

" 4.map 修改dictionary和list元素
" 把字典中所有非正式名称前加 'Miss'
let animal_names = {
    \ 'cat' : 'Miss Cattington',
    \ 'dog' : 'Mr Dogson',
    \ 'parrot' : 'Polly'
\ }

call map(animal_names,
\ {key,val -> IsProperName(val) ? val : 'Miss ' . val})

echo animal_names
